package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.service.CargueService;
import co.gov.medellin.ssti.sub.model.vo.CargueVO;
import co.gov.medellin.ssti.sub.paoyer.administration.exception.AdministrationUserException;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;
import co.gov.medellin.ssti.sub.paoyer.administration.util.AccessControl;
import co.gov.medellin.ssti.sub.paoyer.common.exception.CommonUserException;
import co.gov.medellin.ssti.sub.paoyer.common.exception.UserException;

//Se marca como component.
@Component
public class InformacionAction extends Action {
	@Autowired
	CargueService cargueServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		ActionMessages messages = new ActionMessages();
		try {
			AccessControl access = new AccessControl();
			access.validateAccess(mapping, request, response);

			CargueVO objcargueVO = new CargueVO();
			String strnomcargue = request.getParameter("nombrecargue");
			String lote = request.getParameter("lote");
			String busco = request.getParameter("busco");
			String fechaInicial = request.getParameter("fechaInicial");
			String fechaFinal = request.getParameter("fechaFinal");

			request.removeAttribute("cargue");
			String search = request.getParameter("search");
			if ((Object) search == null) {
				search = (String) request.getAttribute("search");
			}

			if ((Object) lote == null) {
				lote = (String) request.getAttribute("lote");
				search = "ok";
			}
			HttpSession session = request.getSession();

			String ingreso = request.getParameter("ingreso");

			Collection<CargueVO> cargue = null;
			// Para la auditoria de registros
			UserVO user = (UserVO) session.getAttribute("userInfo");
			String terminalAddress = "WEB=" + request.getRemoteAddr();
			if ((Object) ingreso != null) {
				if (ingreso.equals("true")) {
					objcargueVO
							.setCode(request.getAttribute("lote").toString());

					try {
						cargue = cargueServiceImpl
								.findArchivoCargueByCriteria(objcargueVO);
					} catch (Exception e) {
						SUBException.logDebugError("", e);
					}

					if (cargue != null) {
						if (cargue.size() > 0) {
							Iterator<CargueVO> it = cargue.iterator();
							while (it.hasNext()) {
								CargueVO act = it.next();
								if (act.getVflcodigo().equalsIgnoreCase(
										CargueService.BENEFICIOS_EMP)) {
									it.remove();
								} else if (act.getVflcodigo().equalsIgnoreCase(
										CargueService.EMPRESAS_EMP)) {
									it.remove();
								}
							}
							request.setAttribute("cargue", cargue);
						} else {
							request.setAttribute("msg",
									"No se encontraron registros..");
						}
					}
				}
			}

			if ((Object) busco != null) {
				if (busco.equals("buscar")) {
					if (search != null) {

						objcargueVO.setCode(lote);
						objcargueVO.setNombre(strnomcargue.trim());
						objcargueVO.setFechaInicial(fechaInicial);
						objcargueVO.setFechaFinal(fechaFinal);

						try {
							cargue = cargueServiceImpl
									.findArchivoCargueByCriteria(objcargueVO);
						} catch (Exception e) {
							SUBException.logDebugError("", e);
						}

						if (cargue != null) {
							if (cargue.size() > 0) {
								Iterator<CargueVO> it = cargue.iterator();
								while (it.hasNext()) {
									CargueVO act = it.next();
									if (act.getVflcodigo().equalsIgnoreCase(
											CargueService.BENEFICIOS_EMP)) {
										it.remove();
									} else if (act.getVflcodigo()
											.equalsIgnoreCase(
													CargueService.EMPRESAS_EMP)) {
										it.remove();
									}
								}
								request.setAttribute("cargue", cargue);
							} else {
								request.setAttribute("msg",
										"No se encontraron registros..");
							}
						}
					}
				}/*
				 * else if(busco.equals("cargar")) { boolean cargar = false;
				 * try{ CargueDAO objcargueDAO = new CargueDAO(cf); String code
				 * = request.getParameter("seleccionar").trim(); cargar =
				 * objcargueDAO.uploadFile(Integer.valueOf(code).intValue());
				 * cf.closeConnection(objcargueDAO.getConn()); }catch(Exception
				 * e){
				 * request.setAttribute("msg","Error de sql al cargar el archivo"
				 * ); e.printStackTrace(); } if(cargar)
				 * request.setAttribute("msg"
				 * ,"El archivo fue cargado satisfactoriamente."); else
				 * request.setAttribute
				 * ("msg","Error al cargar el archivo, el archivo no existe!");
				 * 
				 * String seleccionar = request.getParameter("seleccionar");
				 * if((Object)seleccionar != null &&
				 * !seleccionar.equalsIgnoreCase("")) {
				 * objcargueVO.setCode(seleccionar); CargueDAO objcargueDAO; ///
				 * request.removeAttribute("cargue"); try{ objcargueDAO = new
				 * CargueDAO(cf); cargue =
				 * objcargueDAO.findArchivoCargueByCriterea(objcargueVO);
				 * cf.closeConnection(objcargueDAO.getConn()); }catch(Exception
				 * e){ e.printStackTrace(); }
				 * 
				 * if(cargue != null){ if(cargue.size() > 0) {
				 * request.setAttribute("cargue",cargue); }else{
				 * request.setAttribute("msg","No se encontraron registros..");
				 * } } }
				 * 
				 * }
				 */else if (busco.equals("validar")) {
					// boolean validar = false;
					try {
						String code = request.getParameter("validar").trim();
						String tipoCargue = request.getParameter("tipoCargue");
						boolean mover = cargueServiceImpl.moveToCargarDatos(
								Integer.parseInt(code), tipoCargue, user
										.getName(), terminalAddress, user
										.getUserGroupName(), user.getCode()
										.toString());
						if (mover) {
							request.setAttribute(
									"msg",
									"El archivo fue cargado, para ver los registros no procesados haga clic en Regs. No procesados ");
						} else {
							request.setAttribute("msg",
									"El archivo no ha sido cargado aun, por favor hacer clic en cargar.");
						}
						String validar = request.getParameter("validar");
						if ((Object) validar != null
								&& !validar.equalsIgnoreCase("")) {
							objcargueVO.setCode(validar);
							try {
								cargue = cargueServiceImpl
										.findArchivoCargueByCriteria(objcargueVO);
							} catch (Exception e) {
								SUBException.logDebugError("", e);
							}

							if (cargue != null) {
								if (cargue.size() > 0) {
									Iterator<CargueVO> it = cargue.iterator();
									while (it.hasNext()) {
										CargueVO act = it.next();
										if (act.getVflcodigo()
												.equalsIgnoreCase(
														CargueService.BENEFICIOS_EMP)) {
											it.remove();
										} else if (act
												.getVflcodigo()
												.equalsIgnoreCase(
														CargueService.EMPRESAS_EMP)) {
											it.remove();
										}
									}
									request.setAttribute("cargue", cargue);
								} else {
									request.setAttribute("msg",
											"No se encontraron registros..");
								}
							}
						}

					} catch (Exception e) {
						request.setAttribute("msg",
								"Error de sql al validar el archivo");
						SUBException.logDebugError("", e);
					}
				}
			}
		} catch (UserException ue) {
			messages.add("msgWarn", new ActionMessage("loginForm.message."
					+ ue.getExceptionVO().getId()));
			saveMessages(request, messages);
			if (ue.getExceptionVO().getId() == AdministrationUserException.ENDED_SESSION) {
				response.sendRedirect(request.getContextPath() + "/index.jsp");
			} else if (ue.getExceptionVO().getId() == CommonUserException.NOT_ALLOWED_RESOURCE) {
				response.sendRedirect(request.getContextPath()
						+ "/admin/tile/invalidatedResource.jsp");
			} else {
				return mapping.getInputForward();
			}
		}

		return mapping.findForward("success");
	}

}